home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 18 Cube Mapping / CubeMap / Shaders / Default.hlsl < prev    next >
Text File  |  2016-03-02  |  3KB  |  102 lines

  1. //***************************************************************************************
  2. // Default.hlsl by Frank Luna (C) 2015 All Rights Reserved.
  3. //***************************************************************************************
  4.  
  5. // Defaults for number of lights.
  6. #ifndef NUM_DIR_LIGHTS
  7.     #define NUM_DIR_LIGHTS 3
  8. #endif
  9.  
  10. #ifndef NUM_POINT_LIGHTS
  11.     #define NUM_POINT_LIGHTS 0
  12. #endif
  13.  
  14. #ifndef NUM_SPOT_LIGHTS
  15.     #define NUM_SPOT_LIGHTS 0
  16. #endif
  17.  
  18. // Include common HLSL code.
  19. #include "Common.hlsl"
  20.  
  21. struct VertexIn
  22. {
  23.     float3 PosL    : POSITION;
  24.     float3 NormalL : NORMAL;
  25.     float2 TexC    : TEXCOORD;
  26. };
  27.  
  28. struct VertexOut
  29. {
  30.     float4 PosH    : SV_POSITION;
  31.     float3 PosW    : POSITION;
  32.     float3 NormalW : NORMAL;
  33.     float2 TexC    : TEXCOORD;
  34. };
  35.  
  36. VertexOut VS(VertexIn vin)
  37. {
  38.     VertexOut vout = (VertexOut)0.0f;
  39.  
  40.     // Fetch the material data.
  41.     MaterialData matData = gMaterialData[gMaterialIndex];
  42.     
  43.     // Transform to world space.
  44.     float4 posW = mul(float4(vin.PosL, 1.0f), gWorld);
  45.     vout.PosW = posW.xyz;
  46.  
  47.     // Assumes nonuniform scaling; otherwise, need to use inverse-transpose of world matrix.
  48.     vout.NormalW = mul(vin.NormalL, (float3x3)gWorld);
  49.  
  50.     // Transform to homogeneous clip space.
  51.     vout.PosH = mul(posW, gViewProj);
  52.     
  53.     // Output vertex attributes for interpolation across triangle.
  54.     float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
  55.     vout.TexC = mul(texC, matData.MatTransform).xy;
  56.     
  57.     return vout;
  58. }
  59.  
  60. float4 PS(VertexOut pin) : SV_Target
  61. {
  62.     // Fetch the material data.
  63.     MaterialData matData = gMaterialData[gMaterialIndex];
  64.     float4 diffuseAlbedo = matData.DiffuseAlbedo;
  65.     float3 fresnelR0 = matData.FresnelR0;
  66.     float  roughness = matData.Roughness;
  67.     uint diffuseTexIndex = matData.DiffuseMapIndex;
  68.  
  69.     // Dynamically look up the texture in the array.
  70.     diffuseAlbedo *= gDiffuseMap[diffuseTexIndex].Sample(gsamAnisotropicWrap, pin.TexC);
  71.     
  72.     // Interpolating normal can unnormalize it, so renormalize it.
  73.     pin.NormalW = normalize(pin.NormalW);
  74.  
  75.     // Vector from point being lit to eye. 
  76.     float3 toEyeW = normalize(gEyePosW - pin.PosW);
  77.  
  78.     // Light terms.
  79.     float4 ambient = gAmbientLight*diffuseAlbedo;
  80.  
  81.     const float shininess = 1.0f - roughness;
  82.     Material mat = { diffuseAlbedo, fresnelR0, shininess };
  83.     float3 shadowFactor = 1.0f;
  84.     float4 directLight = ComputeLighting(gLights, mat, pin.PosW,
  85.         pin.NormalW, toEyeW, shadowFactor);
  86.  
  87.     float4 litColor = ambient + directLight;
  88.  
  89.     // Add in specular reflections.
  90.     float3 r = reflect(-toEyeW, pin.NormalW);
  91.     float4 reflectionColor = gCubeMap.Sample(gsamLinearWrap, r);
  92.     float3 fresnelFactor = SchlickFresnel(fresnelR0, pin.NormalW, r);
  93.     litColor.rgb += shininess * fresnelFactor * reflectionColor.rgb;
  94.  
  95.     // Common convention to take alpha from diffuse albedo.
  96.     litColor.a = diffuseAlbedo.a;
  97.  
  98.     return litColor;
  99. }
  100.  
  101.  
  102.